import axios from 'axios';
import config from '@/config';
import Cookies from 'js-cookie';
import { Toast } from '@douyinfe/semi-ui';

class Request {
  constructor() {
    this.instance = axios.create({
      baseURL: config.baseURL,
      timeout: config.timeout,
      headers: config.headers,
    });

    this.setupInterceptors();
  }

  setupInterceptors() {
    // 请求拦截器
    this.instance.interceptors.request.use(
      config => {
        // 从Cookies获取token
        const token = Cookies.get('token');
        if (token) {
          config.headers['X-User-Token'] = `${token}`;
          config.headers['X-TraceID'] = `${Date.now()}${Math.ceil(Math.random() * 1000)}`;
        }
        return config;
      },
      error => {
        return Promise.reject(error);
      }
    );

    // 响应拦截器
    this.instance.interceptors.response.use(
      response => {
        // 检查响应状态
        if (response.data.code === 401) {
          // 清除本地存储的认证信息
          Cookies.remove('token');
          Cookies.remove('user');

          // 使用 Semi Design 的 Toast 显示提示信息
          Toast.error({
            content: '登录已过期，请重新登录',
            duration: 3,
            stack: true,
          });

          // 延迟跳转，确保用户能看到提示信息
          setTimeout(() => {
            window.location.href = '/login';
          }, 1500);

          return Promise.reject(new Error('登录已过期，请重新登录'));
        }

        // 如果是blob类型的响应（文件下载），直接返回
        if (response.config.responseType === 'blob') {
          return response;
        }

        if (response.data.code === 200 || response.data.success) {
          return response.data;
        }

        // 处理业务错误
        const error = new Error(response.data.message || '操作失败');
        Toast.error({
          content: response.data.message || '操作失败',
          duration: 3,
          stack: true,
        });
        error.response = response;
        return Promise.reject(error);
      },
      async error => {
        // const originalRequest = error.config;
        // // 处理请求超时
        // if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
        //     if (!originalRequest._retry || originalRequest._retry < config.maxRetries) {
        //         originalRequest._retry = (originalRequest._retry || 0) + 1;
        //         Toast.info({
        //             content: `请求超时，正在进行第${originalRequest._retry}次重试...`,
        //             duration: 3,
        //             stack: true
        //         });
        //         return this.instance(originalRequest);
        //     }
        //     return Promise.reject(new Error('请求超时，请检查网络连接'));
        // }
        // 处理网络错误
        console.log('请求响应拦截', error);
        if (error.name === 'AbortError' || error.message === 'canceled') {
          return Promise.reject(error);
        }
        
        if (!error.response) {
          Toast.error({
            content: '网络连接失败，请检查网络设置',
            duration: 3,
            stack: true,
          });
          return Promise.reject(new Error('网络连接失败'));
        }
        // 处理其他HTTP错误
        const errorMessage = this.getErrorMessage(
          error.response.status,
          error.response.data?.message
        );
        Toast.error({
          content: errorMessage,
          duration: 3,
          stack: true,
        });

        return Promise.reject(error);
      }
    );
  }

  async request(config) {
    try {
      const response = await this.instance.request(config);
      return response;
    } catch (error) {
      throw error;
    }
  }

  getErrorMessage(status, message) {
    const statusMessages = {
      400: '请求参数错误',
      401: '未授权，请重新登录',
      403: '没有权限访问',
      404: '请求的资源不存在',
      405: '请求方法不允许',
      408: '请求超时',
      409: '资源冲突',
      413: '请求实体过大',
      414: 'URI过长',
      415: '不支持的媒体类型',
      429: '请求过于频繁',
      500: '服务器内部错误',
      501: '服务未实现',
      502: '网关错误',
      503: '服务不可用',
      504: '网关超时',
    };
    return message || statusMessages[status] || `请求失败(${status})`;
  }

  // GET请求
  get(url, params = {}, config = {}) {
    return this.request({
      method: 'get',
      url,
      params,
      ...config,
    });
  }

  // POST请求
  post(url, data = {}, config = {}) {
    return this.request({
      method: 'post',
      url,
      data,
      ...config,
    });
  }

  // PUT请求
  put(url, data = {}, config = {}) {
    return this.request({
      method: 'put',
      url,
      data,
      ...config,
    });
  }

  // DELETE请求
  delete(url, config = {}) {
    return this.request({
      method: 'delete',
      url,
      ...config,
    });
  }

  // 添加获取 CancelToken 的方法
  getCancelToken() {
    return axios.CancelToken;
  }

  // 添加创建取消令牌源的方法
  createCancelSource() {
    return axios.CancelToken.source();
  }
}

export default new Request();